home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Technotools
/
Technotools (Chestnut CD-ROM)(1993).ISO
/
lang_c
/
cug187
/
crc.c
< prev
next >
Wrap
Text File
|
1985-12-30
|
4KB
|
100 lines
/*@****************************************************************************
* @ *
* @ Cyclic Redundancy Check (CRC) functions *
* @ *
**@***************************************************************************/
/*@
* @ crc_clear:
* @ This function clears the CRC to zero. It should be called prior to
* @ the start of the processing of a block for both received messages,
* @ and messages to be transmitted.
* @
* @ Calling sequence:
* @
* @ short crc;
* @ crc = crc_clear();
*/
short crc_clear()
{
return(0);
}
/*@
* @ crc_update:
* @ this function must be called once for each character which is
* @ to be included in the CRC for messages to be transmitted.
* @ This function is called once for each character which is included
* @ in the CRC of a received message, AND once for each of the two CRC
* @ characters at the end of the received message. If the resulting
* @ CRC is zero, then the message has been correctly received.
* @
* @ Calling sequence:
* @
* @ crc = crc_update(crc,next_char);
*/
short crc_update(crc,crc_char)
short crc;
char crc_char;
{
long x;
short i;
/* "x" will contain the character to be processed in bits 0-7 and the CRC */
/* in bits 8-23. Bit 24 will be used to test for overflow, and then cleared */
/* to prevent the sign bit of "x" from being set to 1. Bits 25-31 are not */
/* used. ("x" is treated as though it is a 32 bit register). */
x = ((long)crc << 8) + crc_char; /* Get the CRC and the character */
/* Repeat the following loop 8 times (for the 8 bits of the character). */
for(i = 0;i < 8;i++)
{
/* Shift the high-order bit of the character into the low-order bit of the */
/* CRC, and shift the high-order bit of the CRC into bit 24. */
x = x << 1; /* Shift "x" left one bit */
/* Test to see if the old high-order bit of the CRC was a 1. */
if(x & 0x01000000) /* Test bit 24 of "x" */
/* If the old high-order bit of the CRC was a 1, exclusive-or it with a one */
/* to set it to 0, and exclusive-or the CRC with hex 1021 to produce the */
/* CCITT-recommended CRC generator of: X**16 + X**12 + X**5 + 1. To produce */
/* the CRC generator of: X**16 + X**15 + X**2 + 1, change the constant from */
/* 0x01102100 to 0x01800500. This will exclusive-or the CRC with hex 8005 */
/* and produce the same CRC that IBM uses for their synchronous transmission */
/* protocols. */
x = x ^ 0x01102100; /* Exclusive-or "x" with a...*/
/* ...constant of hex 01102100 */
/* And repeat 8 times. */
} /* End of "for" loop */
/* Return the CRC as the 16 low-order bits of this function's value. */
return(((x & 0x00ffff00) >> 8)); /* AND off the unneeded bits and... */
/* ...shift the result 8 bits to the right */
}
/*
* @ crc_finish:
* @ This function must be called once after all the characters in a block
* @ have been processed for a message which is to be TRANSMITTED. It
* @ returns the calculated CRC bytes, which should be transmitted as the
* @ two characters following the block. The first of these 2 bytes
* @ must be taken from the high-order byte of the CRC, and the second
* @ must be taken from the low-order byte of the CRC. This routine is NOT
* @ called for a message which has been RECEIVED.
* @
* @ Calling sequence:
* @
* @ crc = crc_finish(crc);
*/
short crc_finish(crc)
short crc;
{
/* Call crc_update twice, passing it a character of hex 00 each time, to */
/* flush out the last 16 bits from the CRC calculation, and return the */
/* result as the value of this function. */
return(crc_update(crc_update(crc,'\0'),'\0'));
}